#pragma once
#ifndef _GEOMETRY_2D_GEOMETRY_
#define _GEOMETRY_2D_GEOMETRY_

// Локальные
#include "math/math.h"
#include "geometry/2d/point.h"
#include "core_global.h"

namespace geometry
{
    namespace _2d
    {
        //! Расстояние между точками A и B.
        inline double distance(const Point &A, const Point &B)
        {
            return qSqrt((A.x() - B.x())*(A.x() - B.x()) + (A.y() - B.y())*(A.y() - B.y()));
        }

        //! Площадь треугольника ABC.
        //! \remarks Площадь расчитывается через определитель специальной матрицы.
        //! \sa Метод конечных элементов для решения скалярных и векторных задач : учеб. пособие / Ю.Г. Соловейчик, М.Э. Рояк,
        //! М.Г. Персова - Новосибирск: Изд-во НГТУ, 2007. - С. 275-277.
        inline double squareTriangle(const Point &A, const Point &B, const Point &C)
        {
            return qAbs((B.x() - A.x())*(C.y() - A.y()) - (C.x() - A.x())*(B.y() - A.y()))/2.;
        }


        //! \fn bool pointInsideTriangle(const Point &A, const Point &B, const Point &C, const Point &Z)
        //! Проверка принадлежности точки Z треугольнику ABC.
        //
        //! Для проверки используется следующий алгоритм: точка принадлежит треугольнику если сумма площадей всех возможных
        //! треугольников, образованных данной точкой и двумя вершинами треугольника, равна площади треугольника.
        //! \return true, если точка принадлежит треугольнику и false - в противном случае.
        //! \sa squareTriangle()
        CORE_EXPORT bool pointInsideTriangle(const Point &A, const Point &B, const Point &C, const Point &Z);
    }
}

#endif // _GEOMETRY_2D_GEOMETRY_
